#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <inttypes.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_system.h"
#include "esp_log.h"
#include <sys/time.h>
#include "util.h"
#include "button.h"


// 全局常量, 字符串, 用于日志打印的标签
const static char* TAG = "rtos";
// 全局变量, 任务句柄
static TaskHandle_t pxTask1;


// 任务，循环打印当前时间
static void task(void* arg)
{
    struct tm datetime;
    while(1) {
        get_time(&datetime);
        ESP_LOGI(TAG, "task running, the current time is: %02d:%02d:%02d.", datetime.tm_hour, datetime.tm_min, datetime.tm_sec);
        delay_ms(1000);
    }
}

// 应用程序入口
void app_main(void)
{
    uint32_t io_num;

    //GPIO初始化
    gpio_init();

    //创建1个队列，队列长度为10，队列项为uint32_t
    gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));

    //创建1个任务，堆栈大小4096，优先级10
    xTaskCreate(task, "task", 4096, NULL, 10, &pxTask1);

    while(true) {
        // 堵塞读取队列中的数据
        if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {
            // 读取成功，则打印出gpio引脚号和当前的电平
            ESP_LOGI(TAG, "GPIO[%ld] 中断触发, level: %d", io_num, gpio_get_level(io_num));
            if(io_num==GPIO_INPUT_BOOT)
            {
                if(gpio_get_level(io_num))
                {
                    vTaskResume(pxTask1);       //恢复任务
                }else
                {
                    vTaskSuspend(pxTask1);      //挂起任务
                }
            }
        }
    }
}
